//
// Created by LiuYou on 2021/6/26.
//

#include <cstdlib>
#include <pthread.h>
#include <cstdio>
#include <cstring>
#include <unistd.h>


#define THR_NUM         20
#define FILE_NAME       "/tmp/out"
#define LINE_SIZE       1024


static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;


// TODO 注意: 每个线程要做的工作, 即每个线程要完成的任务。
static void* func(void*) {
    FILE* fp = std::fopen(FILE_NAME, "r+");
    if (fp == nullptr) {
        std::perror("fopen()");
        std::exit(EXIT_FAILURE);
    }

    char lineBuf[LINE_SIZE]{};

    pthread_mutex_lock(&mutex);

    char* string = std::fgets(lineBuf, LINE_SIZE, fp);
    // 对 std::fgets()函数的返回值进行判断。这里就不写了。
//    if () {
//
//    }


    std::fseek(fp, 0, SEEK_SET);

    sleep(1);

    std::fprintf(fp, "%d\n", std::atoi(lineBuf) + 1);

    std::fclose(fp);

    pthread_mutex_unlock(&mutex);

    pthread_exit(nullptr);
}

/**
 * @brief 为 add例子加入的互斥量。
 * 可以正确运行得出正确的结果。
 */
int main() {

    pthread_t tid[THR_NUM]{};

    for (int i = 0; i < THR_NUM; ++i) {
        int err = pthread_create(tid + i, nullptr,
                                 func, nullptr);
        if (err) {
            std::fprintf(stdout, "pthread_create(): %s\n", std::strerror(err));
            std::exit(EXIT_FAILURE);
        }
    }

    // 收尸环节
    for (unsigned long i : tid) {
        pthread_join(i, nullptr);
    }


    pthread_mutex_destroy(&mutex);

    std::exit(EXIT_SUCCESS);
}